package cn.vehicle.biz.impl;

import cn.hutool.core.util.IdUtil;
import cn.vehicle.biz.SystemConfigBiz;
import cn.vehicle.domains.entity.SysModifyRecordEntity;
import cn.vehicle.domains.entity.SystemConfigEntity;
import cn.vehicle.domains.info.UserInfo;
import cn.vehicle.domains.vo.req.systemConfig.UpdateSystemConfigReq;
import cn.vehicle.service.SysModifyRecordService;
import cn.vehicle.service.config.SystemConfigService;
import cn.vehicle.threadLocal.UserContextThreadLocal;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

/**
 * 系统配置业务实现类
 * <p>
 * 负责系统配置项的修改与记录，包含：
 * <ul>
 *   <li>配置项的新增或更新（根据 key 判断是否存在）；</li>
 *   <li>缓存清理；</li>
 *   <li>配置变更记录日志。</li>
 * </ul>
 * </p>
 *
 * <p>设计约定：</p>
 * <ul>
 *   <li>修改配置后需及时清理缓存，保证实时生效；</li>
 *   <li>所有修改操作需记录前后值与操作人；</li>
 *   <li>异常记录过程不影响主流程。</li>
 * </ul>
 */
@Service
@Slf4j
public class SystemConfigBizImpl implements SystemConfigBiz {

    @Resource
    private SystemConfigService systemConfigService;

    @Resource
    private SysModifyRecordService sysModifyRecordService;

    /**
     * 更新系统配置项
     *
     * <p>逻辑说明：</p>
     * <ol>
     *   <li>根据 key 查询配置是否存在；</li>
     *   <li>若不存在则新增配置，否则更新配置；</li>
     *   <li>清除缓存以保证新值生效；</li>
     *   <li>记录修改日志（包含前后值与操作人）。</li>
     * </ol>
     *
     * @param req 系统配置更新请求参数（包含 key 与 value）
     */
    @Override
    public void updateSystemConfig(UpdateSystemConfigReq req) {

        // 根据 key 查询现有配置项
        SystemConfigEntity systemConfigEntity = systemConfigService.getEntityByKey(req.getKey());

        // 获取修改前的配置值（若不存在则为空）
        String beforeValue = systemConfigEntity == null ? "" : systemConfigEntity.getValue();
        String afterValue;

        // 配置不存在：执行新增操作
        if (systemConfigEntity == null) {
            systemConfigEntity = new SystemConfigEntity();
            BeanUtils.copyProperties(req, systemConfigEntity);
            afterValue = systemConfigEntity.getValue();
            systemConfigService.insert(systemConfigEntity);
        // 配置存在：执行更新操作
        } else {
            SystemConfigEntity updateEntity = new SystemConfigEntity();
            BeanUtils.copyProperties(req, updateEntity);
            afterValue = updateEntity.getValue();
            systemConfigService.update(updateEntity);
        }


        // 清除对应配置项的缓存，保证修改立即生效
        systemConfigService.removeCache(req.getKey());

        // 构建修改记录对象，用于记录配置变更日志
        SysModifyRecordEntity sysModifyRecordEntity = new SysModifyRecordEntity();
        sysModifyRecordEntity.setBatchNo(IdUtil.simpleUUID());
        sysModifyRecordEntity.setBeforeValue(beforeValue);
        sysModifyRecordEntity.setAfterValue(afterValue);
        sysModifyRecordEntity.setModifyType("system_config.v");

        // 从线程上下文中获取当前操作用户信息
        UserInfo userInfo = UserContextThreadLocal.getUserInfo();
        sysModifyRecordEntity.setUserId(userInfo.getId());

        // 异常安全记录操作日志，不影响主流程
        try {
            sysModifyRecordService.addRecord(sysModifyRecordEntity);
        } catch (Exception e) {
            log.error("变更信息记录异常", e);
        }

    }
}
